const path=require("path");
const Koa=require("koa");
const logger=require("koa-logger");//产生日志记录
const onerror=require("koa-onerror");//错误链接和转换显示功能
const serve=require("koa-static");
const router=require("./router");
const koaBody=require("koa-body");
const session=require("koa-session");



const app=new Koa();
app.use(logger());//日志：记录开发中所有的操作流程，当开发出现错误时候，可以快速完成错误定位以及触发错误的源头和执行过程
onerror(app);

/* 
静态资源处理中间件(图片，视频，css，js...),不需要服务器进行处理可以直接进行访问的资源
    koa-static中间件可以在koa请求处理时候，判断浏览器访问的相关资源在对应的静态资源目录中是否存在
    如果存在则直接返回该静态资源的相关数据，且中间件不再调用next函数
    如果不存在则直接调用next函数函数访问下一个中间件
koa-static中间件一般被定义在koa请求响应处理中间件的第一行
koa-static中间件在定义时,需要指定一个项目目录作为静态资源的存放目录
koa-static指定的静态资源存放目录，从项目结构上来说，可以认为是服务器的根目录
 */

app.use(koaBody({
    multipart:true,//支持文件上传
    formidable:{
        uploadDir:path.join(__dirname,'./public/upload'),//设置上传文件由二进制数据转上传到服务器的存放目录，文件存储时会完成重新命名操作
        keepExtensions:true//设置是否保留上传文件的后缀名(默认是false)
    }
}));
// app.use(serve("./public"));
let staticPath=path.join(__dirname,'./public');
app.use(serve(staticPath));


app.keys=["itany-koa"];
const CONFIG={
    key: 'SESSIONID', /** (string) cookie key (default is koa.sess) */
    maxAge: 86400000//cookies记录的数据的有效期，默认值为1天，取值是ms
};

// session(CONFIG,koa实例)
// config是session构建的相关配置，需要使用session的koa实例，且koa实例必须提供一个加密字符串，不然seesion无法生效
// 该中间件会自行判断是否需要session空间功能，如果需要会提供session空间和id，否则不提供
// koa-session中间件会在ctx的综合对象提供session属性对象，用于完成session的空间操作
app.use(session(CONFIG,app));




//router是路由定义对象，用于提供定义时地址和回调函数之间的对应关系
// router完成关系定义后，由router.routes()方法执行完成路由表的生成
// 路由表->一段js的路由和方法对应的判断逻辑
app.use(router.ajaxRouter.routes());
app.use(router.exerciseRouter.routes());
app.use(router.paramsRouter.routes());
app.use(router.jqueryRouter.routes());
app.use(router.corsRouter.routes());

app.listen(3000);